Saltar al contenido principal

Single Sign On - SSO

Implementación necesaria para realizar el SSO​

  1. El primer paso para comenzar la implementación del flujo de SSO es poner a disposición un endpoint con una llave pública de firma. Visita Jwks para entender más y sobre cómo obtienes esa llave.
  2. Crear un Id token del usuario logueado, firmado con la llave privada referente a la llave pública puesta a disposición en el endpoint de Jwks. A continuación un ejemplo de payload e implementación programática en C#:
{
"sub": "{cpf del usuario logueado}",
"jti": "e2e3b202-19e9-46dc-b061-c5f22eb34194",
"name": "NOMBRE DEL USUARIO",
"email": "usuario@email.com",
"phone_number": "{teléfono del usuario}", // ej:5511000000000
"exp": 1706299657,
"iss": "{base path del endpoint jwks}", //ej: https://id.sandbox.btgpactual.com
"aud": "btg:empresas:companies:{cnpj}" //cnpj de la empresa que tendrá la cuenta abierta
}
var claims = new Claim[]
{
new Claim(JwtRegisteredClaimNames.Sub, ""),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim("name", ""),
new Claim("email", ""),
new Claim("phone_number", ""),
};

var rsaParameters = rsaKeyForSigning.ExportParameters(true);
var rsaSecurityKey = new RsaSecurityKey(rsaParameters);
var signingCredentials = new SigningCredentials(rsaSecurityKey, SecurityAlgorithms.RsaSha256);

var tokenOptions = new JwtSecurityToken(
issuer: iss,
audience: "btg:empresas:companies:{cnpj_onboarding}",
claims: claims,
expires: DateTime.Now.AddMinutes(2),
signingCredentials: signingCredentials
);

var tokenHandler = new JwtSecurityTokenHandler();
var idToken = tokenHandler.WriteToken(tokenOptions);
  1. Tras firmar el id token, deberás obtener en el endpoint de jwks de BTG Pactual Empresas la llave pública de criptografía
using var httpClient = new HttpClient();
var btgIdJwksEndpoint = "https://id.btgpactual.com/.well-known/jwks";
var jwksResponse = httpClient.GetStringAsync(btgIdJwksEndpoint).Result;
var jwksData = JObject.Parse(jwksResponse);
var encryptionKeyData = jwksData["keys"].FirstOrDefault(k => k["use"].ToString() == "enc");
string e = encryptionKeyData["e"].ToString();
string n = encryptionKeyData["n"].ToString();
Jwk rsaEncryptionKey = new Jwk(e, n);
  1. Con la llave pública de criptografía, ahora debes utilizarla para generar un JWE, que no es más que el JWT referente al id token encriptado.
var headers = new Dictionary<string, object>
{
{ "kid", encryptionKeyData["kid"].ToString() }
};
var recipients = new JweRecipient[]
{
new JweRecipient(JweAlgorithm.RSA_OAEP, rsaEncryptionKey, headers)
};
string encryptedJweIdToken = JWE.Encrypt(idToken, recipients, JweEncryption.A256GCM, mode: SerializationMode.Compact);
  1. Con el JWE en mano debes crear un RAR(rich authorization request) según lo siguiente:
{
"type": "btg:empresas:apps:b2b:onboarding",
"idp": "{parceiro_idp}", //idp del socio registrado en BtgId
"principal": "{parceiro_client_id}",
"resource": "btg:empresas:companies:{cnpj_onboarding}",
"privileges": "btg:empresas:gatekeeper:apps:onboarding-enrichment"
}
  var authorizationDetails = WebUtility.UrlEncode(JsonConvert.SerializeObject(new[]
{
new {
type = "btg:empresas:apps:b2b:onboarding",
idp = "{parceiro_idp}", //idp del socio registrado en BtgId
principal = "{parceiro_client_id}",
resource = "btg:empresas:companies:{cnpj_onboarding}",
privileges = new string[] { "btg:empresas:gatekeeper:apps:onboarding-enrichment" }
}
}));
  1. Tras realizar el RAR, debe realizarse una redirección hacia la siguiente dirección, completando los campos con los datos obtenidos a lo largo del flujo:
    https://app.empresas.btgpactual.com/conta-pj-btg?idp_hint={parceiro_idp}&acr_values={parceiro_idp}:sso&id_token_hint={encryptedJweIdToken}&authorization_details={authorizationDetails}&redirect=L2NhZGFzdHJvL3BhcmNlaXJv Donde:
  • idp_hint: Campo referente al "idp" presente en el RAR.
  • acr_values: Campo referente al "idp" presente en el RAR.
  • id_token_hint: Campo referente al JWE encriptado.
  • authorization_details: Campo referente a la var authorizationDetails
  • redirect: Campo fijo con valor L2NhZGFzdHJvL3BhcmNlaXJv